<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<script>
	// 首先，我们用var o = {}语句创建一个么有任何私有属性的“空”对象作为画板，然后在逐步为其添加属性。但这次我们不通过this来实现，而是直接将现有的对象的属性全部拷贝下来。例如在下面的实现中，函数将接受一个对象并返回它的副本
	function extendCopy(p) {
		var c = {};
		for(var i in p){
			c[i] = p[i]
		}
		c.uber = p;
		return c;
	}

	// 单纯的属性全拷贝是一种非常简单直接的模式，但适用范围很广。下面来看看extendCopy()的实际应用。首先，我们需要一个基本对象
	var shape = {
		name: 'Shape',
		toString: function() {
			return this.name;
		}
	};

	// 接着我们就可以根据这个就对象来创建一个新对象了，只需调用extendCopy()函数，该函数会返回一个新对象。然后，我们可以继续对这个新对象进行扩展，添加额外的功能。
	var twoDee = extendCopy(shape);
	twoDee.name = '2D shape';
	twoDee.toString = function(){
		return this.user.toString() + ', ' + this.name;
	}

	// 下面，我们让triangle对象继承一个2D图形对象：
	var triangle = extendCopy(twoDee);
	triangle.name = 'Triangle';
	triangle.getArea = function() {
		return this.side * this.height / 2;
	}

	// 使用该triangle
	triangle.side = 5;
	triangle.height = 10;
	console.log(triangle.getArea());
	console.log(triangle.toString());

	// 对这种方法而言，可能的问题就在于初始化一个新的triangel对象的过程过于繁琐。因为我们必须要对该对象的side和height值进行手动修改，这与之前直接将相关的值作为参数传递给构造器函数是不一样的。但这方面的问题只需要调用一个函数就能轻而易举的解决，例如与构造器函数类似的Init方法，我们只需要在调用时将这两个值以参数的形式传递给他即可。又或者，我们可以将extendCopy()函数设计为接受两个参数：第一个参数不变，第二个参数是包含我们需要的额外属性的对象，然后我们就可以在函数体中，使用这些额外属性对所返回的拷贝进行扩展，或者换一种说法，将第一个参数的拷贝与第二个参数合并
</script>
</body>
</html>